package com.vue.admin.service.common.mybatis.dao;

import com.vue.admin.service.common.mybatis.entity.BaseEntity;
import com.vue.admin.service.common.mybatis.entity.Page;
import com.vue.admin.service.common.mybatis.entity.Query;

import java.util.List;

/**
 * @program: vue-admin-service
 * @description: 通用数据持久层封装接口
 * @author: zhangyangyang
 * @create: 2020-04-03 11:07
 **/
public interface BaseDAO<T extends BaseEntity,E> {

    /**
     * 插入数据
     * @param record
     * @return
     */

    int insert(T record);

    /**
     * 批量插入数据
     * @param recordList
     * @return
     */
    int insertList(List<T> recordList);

    /**
     * 更新数据 属性为null的字段也将被更新
     * @param record
     * @return
     */
    int updateByPrimaryKey(T record);

    /**
     * 更新数据 属性为null的字段不被更新
     * @param record
     * @return
     */
     int updateByPrimaryKeySelective(T record);

    /**
     * 批量更新数据
     * @param recordList
     * @return
     */
     int updateListByPrimaryKeySelective(List<T> recordList);

    /**
     * 逻辑删除数据
     * @param id
     * @return
     */
     int deleteByPrimaryKeyByLogic(E id);

    /**
     * 批量逻辑删除数据
     * @param ids
     * @param clazz
     * @return
     */
     int deleteListByPrimaryKeyByLogic(E[] ids,Class<T> clazz);

    /**
     * 物理删除
     * @param id
     * @return
     */
     int deleteByPrimaryKey(E id);

    /**
     * 批量物理删除
     * @param ids
     * @param clazz
     * @return
     */
     int deleteListByPrimaryKey(List<E> ids, Class<T> clazz);

    /**
     * 根据主键ID获取数据
     * @param ids
     * @param clazz
     * @return
     */
     List<T> getListByIds(E[] ids,Class<T> clazz);

    /**
     * 根据主键ID获取数据
     * @param id
     * @return
     */
     T getByPrimaryKey(E id);

    /**
     * 分页查询列表
     * @param page
     * @param query
     * @return
     */
     List<T> listForPage(Page<T> page, Query query);

    /**
     * 查询列表
     * @param query
     * @return
     */
     List<T> list(Query query);

    /**
     * 根据属性选择唯一数据
     * @param record
     * @return
     */
     T selectOne(T record);

    /**
     * 根据实体属性选择数据集合
     * @param record
     * @return
     */
     List<T> selectList(T record);
}
